package IA;

public class MinMax {
	int ply;
	
	public MinMax(int _ply){
		ply=10;
	}
	
	public Accion minMax(int n,Estado e){
		Accion[] c= e.getApplicableActions(n);
		double[] vC=new double[c.length];
		for(int i=0;i<c.length;i++){			
			Estado aux=e.applyAction(c[i],n);
			vC[i]=max(n,aux,Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,ply);
		}
		return c[menor(vC)];
	}

	private int menor(double[] vC) {
		// TODO Auto-generated method stub
		int n=0;
		for (int i=1; i<vC.length;i++){
			if(vC[n]>vC[i]){
				n=i;
			}
		}
		return n;
	}

	private double max(int n, Estado _aux, double alpha,double beta, int pl) {
		if (_aux.isSolution(n)){
			return Double.NEGATIVE_INFINITY;
		}
		if (pl==0){
			Heuristica h=new Heuristica(_aux, n);
			return h.calcular();
		}
		Accion[] c=_aux.getApplicableActions(n);
		for(int i=0;i<c.length;i++){
			Estado aux=_aux.applyAction(c[i],n);
			// si emos empezado una nueva ronda n cambia a una posicion mas
			//cercana a 0 y si es 0 a la ultima posicion
			if(aux.getFase()==0&&aux.getTurno()==0){
				n=(n+_aux.numJugadores()-1)%_aux.numJugadores();
			}
			beta=Math.max(beta, min(n,aux,alpha,beta,pl-1));
			if(alpha<=beta){
				return alpha;
			}
		}
		return beta;
	}

	private double min(int n, Estado _aux, double alpha, double beta, int pl) {
		if (_aux.isSolution(n)){
			return Double.NEGATIVE_INFINITY;
		}
		if (pl==0){
			Heuristica h=new Heuristica(_aux, n);
			return h.calcular();
		}
		Accion[] c=_aux.getApplicableActions(n);
		for(int i=0;i<c.length;i++){
			Estado aux=_aux.applyAction(c[i],n);
			// si emos empezado una nueva ronda cambia a una posicion mas
			//cercana a 0 y si es 0 a la ultima posicion
			if(aux.getFase()==0&&aux.getTurno()==0){
				n=(n+_aux.numJugadores()-1)%_aux.numJugadores();
			}
			alpha=Math.min(alpha, max(n,aux,alpha,beta,pl-1));
			if(alpha<=beta){
				return alpha;
			}
		}
		return alpha;
	}
}
